home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 2.toast / pc / sample code / quicktime / quicktime for java / draggingsprites / src / draggingsprites.java
Encoding:
Java Source  |  2000-09-28  |  8.5 KB  |  262 lines

  1. /*
  2.  * QuickTime for Java SDK Sample Code
  3.  
  4.    Usage subject to restrictions in SDK License Agreement
  5.  * Copyright: © 1996-1999 Apple Computer, Inc.
  6.  
  7.  */
  8. import java.awt.*;
  9. import java.awt.event.*;
  10. import java.io.IOException;
  11. import java.io.File;
  12.  
  13. import quicktime.*;
  14. import quicktime.qd.*;
  15. import quicktime.std.*;
  16. import quicktime.io.*;
  17. import quicktime.std.image.*;
  18. import quicktime.util.*;
  19. import quicktime.std.movies.*;
  20. import quicktime.std.movies.media.*;
  21. import quicktime.app.actions.*;
  22. import quicktime.app.anim.*;
  23. import quicktime.app.audio.*;
  24. import quicktime.app.display.*;
  25. import quicktime.app.image.*;
  26. import quicktime.app.QTFactory;
  27.  
  28. import ds.actions.*;
  29.  
  30. public final class DraggingSprites extends Frame implements StdQTConstants {
  31.     static final int 
  32.                 kWidth = 400,
  33.                 kHeight = 300;
  34.     
  35.     // MIDI note numbers for drum kit instrument
  36.     static final int
  37.         kSnareDrum = 40,
  38.         kClosedHiHat = 44,
  39.         kOpenHiHat = 46,
  40.         kCrashCymbal = 49,
  41.         kRideCymbal = 51;
  42.  
  43.     public static void main (String[] args) {
  44.         try {
  45.             QTSession.open();
  46.             new DraggingSprites().show();
  47.         } catch (Exception e) {
  48.             e.printStackTrace();
  49.             QTSession.close();
  50.         }
  51.     }
  52.     
  53. //____________________ INSTANCE VARIABLES    
  54.     private Compositor sd;
  55.     private QTCanvas canv;
  56.     
  57.     private boolean performance = true;
  58.     
  59. //____________________ INSTANCE METHODS    
  60.     DraggingSprites () throws QTException, IOException {
  61.         super ("Sprite App");
  62.         addNotify();
  63.         Insets insets = getInsets();
  64.         setBounds (0, 0, (insets.left + insets.right + kWidth), (insets.top + insets.bottom + kHeight));
  65.  
  66.         try {
  67.             QTSession.open();
  68.  
  69.             setLayout (new BorderLayout());
  70.             canv = new QTCanvas (QTCanvas.kInitialSize, 0.5F, 0.5F);
  71.             add ("Center", canv);
  72.             Dimension size = new Dimension(kWidth, kHeight);
  73.             QDGraphics gw = new QDGraphics (new QDRect(size));
  74.             sd = new Compositor (gw, QDColor.red, 20, 1);    
  75.             File matchFile = QTFactory.findAbsolutePath ("images/Ship01.pct");    //this file must exist in the directory!!!    
  76.             ImageDataSequence is = ImageUtil.createSequence (matchFile);
  77.             createSprites (sd, ImageUtil.makeTransparent (is, QDColor.blue), size);
  78.             sd.getTimer().setRate (2);
  79.  
  80.             canv.setClient (sd, true);
  81.         } catch (Exception e) {
  82.             e.printStackTrace();
  83.             throw new QTRuntimeException (e);
  84.         }
  85.  
  86.         addWindowListener(new WindowAdapter () {
  87.             public void windowClosing (WindowEvent e) {
  88.                 QTSession.close();
  89.                 dispose();
  90.             }
  91.  
  92.             public void windowClosed (WindowEvent e) {
  93.                 System.exit(0);
  94.             }
  95.         });
  96.     }
  97.                 
  98.     void createSprites (Compositor sd, ImageDataSequence seq, Dimension size) throws Exception {
  99.         // This is the instrument that will be used to play all of the notes
  100.         // of the different actions -> we use a polyphony of 10
  101.         // which is a reasonable estimate of the maximum number of notes
  102.         // that will be sounding at a given time
  103.         final NoteChannelControl nc = new NoteChannelControl (StdQTConstants.kFirstDrumkit, 10);
  104.  
  105.         Matrix matrix = new Matrix();
  106.         matrix.setTx(size.width / 4);
  107.         matrix.setTy(size.height / 2);
  108.         TwoDSprite s1 = new TwoDSprite(seq, matrix, true, 1);
  109.         sd.addMember (s1);
  110.         
  111.         // paint a sprite and set a hot spot region for it
  112.         // the green region is the hot spot
  113.         // we use a 16 bit BigEndian pixel format as we have no blending on this sprite
  114.         matrix = new Matrix();
  115.         matrix.setTx(20);
  116.         matrix.setTy(20);
  117.         QDRect r40 = new QDRect (40, 40);
  118.         QDRect r8 = new QDRect (1, 1, 8, 8);
  119.         QDGraphics y = new QDGraphics (QDConstants.k16BE555PixelFormat, r40);
  120.         y.setBackColor (QDColor.yellow);
  121.         y.eraseRect (null);
  122.         y.setForeColor (QDColor.green);
  123.         y.paintRect (r8);
  124.         EncodedImage ei = RawEncodedImage.fromPixMap (y.getPixMap());
  125.         ImageDescription id = new ImageDescription (y.getPixMap());
  126.         ImageDataSequence idsy = new ImageDataSequence (id);
  127.         idsy.addMember (ei);
  128.         if ((QTSession.isCurrentOS(QTSession.kWin32) && QTSession.getQTMajorVersion() == 3) == false)    //doesn't work on QT3.0.2 on Win
  129.             idsy = ImageUtil.makeTransparent (idsy, QDColor.black, new QDGraphics (QDConstants.k16BE555PixelFormat, r40), new Region (r8));
  130.         TwoDSprite s2 = new TwoDSprite(idsy, matrix, true, 10);
  131.         sd.addMember (s2);
  132.  
  133.         matrix = new Matrix();
  134.         matrix.setTx(size.width / 2);
  135.         matrix.setTy(size.height / 2);
  136.         TwoDSprite s3 = new TwoDSprite(seq, 15, matrix, true, 10);
  137.         sd.addMember (s3);
  138.         ImageSequencer is3 = new ImageSequencer (seq);
  139.         is3.setCurrentFrame (15);    //keep in sync with sprite's current image
  140.         is3.setLooping (ImageSequencer.kLoopForwards);
  141.  
  142.         SimpleActionList al = new SimpleActionList();
  143.         ImageSequencer is = new ImageSequencer (seq);
  144.         is.setLooping (ImageSequencer.kLoopForwards);
  145.         al.addMember (new NextImageAction (15, 1, is, s1));
  146.         BounceAction b1 = new BounceAction (20, 1, sd, s1, 1, 2);
  147.         b1.setActionable (new Actionable () {
  148.             public void trigger () {
  149.                 try {
  150.                     nc.playNoteFor (kCrashCymbal, 127, 20);
  151.                 } catch (QTException e) {
  152.                     e.printStackTrace();
  153.                 }
  154.             }
  155.         });
  156.         al.addMember (b1);
  157.                     // 360 degrees at a scale of 20
  158.         al.addMember (new RotateAction (360, 20, sd, s3));
  159.                     // 360/ (1/2)number of images changes at a scale of 20
  160.         al.addMember (new NextImageAction ((360 / seq.size() / 2), 20, is3, s3));
  161.         al.addMember (new BounceAction (1, 10, sd, s3, 1, 1)); // a slow drift
  162.         sd.addController(al);
  163.  
  164.     //all mouse downs with NO modifiers pressed will drag all sprites
  165.         Dragger dragger = new Dragger (MouseResponder.kNoModifiersMask);
  166.         dragger.setActionable (new Actionable () {
  167.             public void trigger () {
  168.                 try {
  169.                     nc.playNoteFor (kRideCymbal, 127, 80);
  170.                 } catch (QTException e) {
  171.                     e.printStackTrace();
  172.                 }
  173.             }
  174.         });
  175.         SWController ct = new SWController (dragger, true);
  176.         sd.addController (ct);
  177.         
  178.     //only shift key down when mouse pressed will allow sprite number 2 & 3 to be scaled when dragged
  179.         MouseController controller = new SWController (new Scaler (400, InputEvent.SHIFT_MASK), false);
  180.         controller.addMember (s3);
  181.         controller.addMember (s2);
  182.         sd.addController (controller);
  183.  
  184.     //only option/alt key will allow sprite number 3 to be skewed when dragged
  185.         controller = new SWController (new Skewer (200, 200, InputEvent.ALT_MASK), false);
  186.         controller.addMember (s2);
  187.         sd.addController (controller);
  188.         
  189.         // this responder responds to rollover type events on sprites when NO modifiers are pressed
  190.         final GenericResponder gr = GenericResponder.asRolloverListener (MouseResponder.kNoModifiersMask, MouseResponder.kModifiersExactMatch);
  191.         // add a listener to play notes when rolled over 
  192.         // 
  193.         gr.addQTMouseMotionListener (new QTMouseMotionAdapter () {            
  194.             // keep the notes playing even when we are being dragged
  195.             // however this is NOT enough to properly handle drag events
  196.             // - this is done be the Dragger-Controller pairing
  197.             public void mouseDragged (MouseEvent event) {
  198.                 try {
  199.                     nc.playNoteFor (kClosedHiHat, 127, 80);
  200.                 } catch (QTException e) {
  201.                     e.printStackTrace();
  202.                 }
  203.             }
  204.  
  205.             public void mouseMoved (MouseEvent event) {
  206.                 try {
  207.                     nc.playNoteFor (kClosedHiHat, 127, 80);
  208.                 } catch (QTException e) {
  209.                     e.printStackTrace();
  210.                 }
  211.             }
  212.             
  213.             public void mouseExitedTarget (MouseEvent event) {
  214.                 try {
  215.                     nc.playNoteFor (kOpenHiHat, 127, 80);
  216.                 } catch (QTException e) {
  217.                     e.printStackTrace();
  218.                 }
  219.             }
  220.  
  221.             public void mouseEnteredTarget (MouseEvent event) {
  222.                 try {
  223.                     nc.playNoteFor (kSnareDrum, 127, 80);
  224.                 } catch (QTException e) {
  225.                     e.printStackTrace();
  226.                 }
  227.             }
  228.         });
  229.         // another listener that prints out the target on entry and the space on exit of a rollover occurance
  230.         gr.addQTMouseMotionListener (new QTMouseMotionAdapter () {
  231.             GenericResponder g = gr;
  232.             GraphicsMode savedGM;
  233.             GraphicsMode setGM = new GraphicsMode (QDConstants.blend, QDColor.lightGray);
  234.             
  235.             public void mouseEnteredTarget (MouseEvent event) {
  236.                 try {
  237.                     if (g.getTarget() instanceof TwoDSprite) {    // just for sanity
  238.                         TwoDSprite sprite = (TwoDSprite)g.getTarget();
  239.                         savedGM = sprite.getGraphicsMode();
  240.                         sprite.setGraphicsMode (setGM);
  241.                     }
  242.                 } catch (QTException e) {
  243.                     throw new QTRuntimeException (e);
  244.                 }
  245.             }
  246.  
  247.             public void mouseExitedTarget (MouseEvent event) {
  248.                 try {
  249.                     if (g.getTarget() instanceof TwoDSprite) {    // just for sanity
  250.                         TwoDSprite sprite = (TwoDSprite)g.getTarget();
  251.                         sprite.setGraphicsMode (savedGM);
  252.                     }
  253.                 } catch (QTException e) {
  254.                     throw new QTRuntimeException (e);
  255.                 }
  256.             }
  257.         });
  258.         SWController ctr = new SWController (gr, true);
  259.         sd.addController (ctr);
  260.     }
  261. }
  262.